package com.york.tinyrpc.protoss.springboot.startert.annotation;

import com.york.tinyrpc.protoss.constant.LoadBalancerConstants;
import com.york.tinyrpc.protoss.constant.RetryStrategyConstants;
import com.york.tinyrpc.protoss.constant.TinyRpcConstants;
import com.york.tinyrpc.protoss.constant.TolerantStrategyConstants;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 在需要注入服务代理对象的属性上使用，类似 Spring 中的 @Resource 注解
 * RpcReference 注解中，需要指定调用服务相关的属性，比如服务接口类（可能存在多个接口）、版本号、负载均衡器、重试策略、是否 Mock 模拟调用等。
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface TinyRpcReference {
    /**
     * 服务接口类
     */
    Class<?> interfaceClass() default void.class;

    /**
     * 版本
     */
    String serviceVersion() default TinyRpcConstants.DEFAULT_SYSTEM_VERSION;

    /**
     * 负载均衡器
     */
    String loadBalancer() default LoadBalancerConstants.ROUND_ROBIN;

    /**
     * 重试策略
     */
    String retryStrategy() default RetryStrategyConstants.NO_RETRY;

    /**
     * 容错策略
     */
    String tolerantStrategy() default TolerantStrategyConstants.FAIL_FAST;

    /**
     * 模拟调用
     */
    boolean mock() default false;
}
